package org.openea.eap.module.obpm.service.form.generator;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.nodes.Element;
import org.openbpm.base.core.util.AppUtil;
import org.openbpm.base.core.util.StringUtil;
import org.openbpm.base.core.util.ThreadMapUtil;
import org.openbpm.bus.api.constant.BusTableRelType;
import org.openbpm.bus.api.model.IBusTableRel;
import org.openbpm.bus.api.model.IBusinessColumn;
import org.openea.eap.module.obpm.model.form.design.FormColumn;
import org.openea.eap.module.obpm.model.form.design.FormGroup;


public class IviewFormElementGenerator
        extends AbsFormElementGenerator {
    public String getGeneratorName() {
        return "iviewGenerator";
    }


    private void handleVModel(Element element, IBusinessColumn column) {
        String boCode = (String) ThreadMapUtil.get("boCode");
        IBusTableRel relation = (IBusTableRel) ThreadMapUtil.get("relation");

        if (relation.getType().equals(BusTableRelType.ONE_TO_MANY.getKey())) {
            element.attr("v-model", column.getTable().getKey() + "." + column.getKey());

            return;
        }
        element.attr("v-model", getScopePath(relation) + "." + column.getKey());

        handleElementPlaceHolder(column, element);
    }


    protected String getColumnOnetext(IBusinessColumn column) {
        Element element = getElement("i-input");

        handleVModel(element, column);
        handlePermission(element, column);
        handleValidateRules(element, column);

        return element.toString();
    }


    protected String getColumnDate(IBusinessColumn column) {
        Element element = getElement("ab-date");

        handleVModel(element, column);
        element.attr("v-bind:ab-permission", getPermissionPath(column));
        element.attr("desc", column.getTable().getComment() + "-" + column.getComment());


        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "format");
        String format = config.getString("format");

        element.attr("format", format);

        return element.toString();
    }


    protected String getColumnDic(IBusinessColumn column) {
        Element element = getElement("ab-dict");

        handleVModel(element, column);
        element.attr("v-bind:ab-permission", getPermissionPath(column));
        element.attr("desc", column.getTable().getComment() + "-" + column.getComment());


        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "key");
//        if (!config.containsKey("key")) {
//            throw new BusinessException(String.format("表【%s】数据字典  字段【%s】解析失败,alias 配置信息不能为空", new Object[]{column.getTable().getKey(), column.getComment()}));
//        }

        element.attr("dict-key", config.getString("key"));

        return element.toString();
    }


    protected String getColumnIdentity(IBusinessColumn column) {
        Element element = getElement("ab-serial-no");
        handleVModel(element, column);
        element.attr("v-bind:ab-permission", getPermissionPath(column));
        handleValidateRules(element, column);

        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "alias");
//        if (!config.containsKey("alias")) {
//            throw new BusinessException(String.format("表【%s】流水号  字段【%s】解析失败,alias 配置信息不能为空", new Object[]{column.getTable().getKey(), column.getComment()}));
//        }
        element.attr("serial-no", config.getString("alias"));

        return element.toString();
    }


    protected String getColumnMultitext(IBusinessColumn column) {
        Element element = getElement("i-input").attr("type", "textarea");

        handleVModel(element, column);
        handlePermission(element, column);
        handleValidateRules(element, column);

        return element.toString();
    }


    protected String getColumnCheckBox(IBusinessColumn column) {
        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "options");
//        if (!config.containsKey("options")) {
//            throw new BusinessException(String.format("表【%s】CheckBox 字段  【%s】解析失败,options 配置信息不能为空", new Object[]{column.getTable().getKey(), column.getComment()}));
//        }

        Element checkbox = getElement("ab-checkbox-group");
        handleVModel(checkbox, column);
        handlePermission(checkbox, column);
        handleValidateRules(checkbox, column);

        JSONArray options = config.getJSONArray("options");
        for (int i = 0; i < options.size(); i++) {
            JSONObject option = options.getJSONObject(i);

            Element checkboxEl = checkbox.appendElement("checkbox");
            checkboxEl.attr("label", option.getString("key"));
            checkboxEl.appendText(option.getString("txt"));
        }
        return checkbox.toString();
    }


    protected String getColumnRadio(IBusinessColumn column) {
        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "options");
//        if (!config.containsKey("options")) {
//            throw new BusinessException(String.format("表【%s】Radio 字段  【%s】解析失败,options 配置信息不能为空", new Object[]{column.getTable().getKey(), column.getComment()}));
//        }

        Element radioGroup = getElement("radio-group");
        JSONArray options = config.getJSONArray("options");

        handleVModel(radioGroup, column);
        handlePermission(radioGroup, column);
        handleValidateRules(radioGroup, column);

        for (int i = 0; i < options.size(); i++) {
            JSONObject option = options.getJSONObject(i);

            Element label = radioGroup.appendElement("radio");
            label.attr("label", option.getString("key"));
            label.appendText(option.getString("txt"));
        }

        return radioGroup.toString();
    }


    protected String getColumnSelect(IBusinessColumn column, Boolean isMultiple) {
        JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
        checkCtrConfig(column, config, "options");
//        if (!config.containsKey("options")) {
//            throw new BusinessException(String.format("表【%s】Select 字段  【%s】解析失败,options 配置信息不能为空", new Object[]{column.getTable().getKey(), column.getComment()}));
//        }

        Element iSelectEl = getElement("i-select");
        handleVModel(iSelectEl, column);
        handlePermission(iSelectEl, column);
        handleValidateRules(iSelectEl, column);
        iSelectEl.attr(":disabled", "'r'==" + getPermissionPath(column));

        if (isMultiple.booleanValue()) {
            iSelectEl.attr("multiple", "true");
        }

        Element select = iSelectEl.appendElement("i-option");
        select.attr("value", "");
        select.text("请选择");

        JSONArray options = config.getJSONArray("options");
        for (int i = 0; i < options.size(); i++) {
            JSONObject option = options.getJSONObject(i);

            Element element = iSelectEl.appendElement("i-option");
            element.attr("value", option.getString("key"));
            element.text(option.getString("txt"));
        }

        return iSelectEl.toString();
    }


    protected String getColumnFile(IBusinessColumn column) {
        Element element = getElement("ab-upload");
        handleVModel(element, column);
        element.attr("v-bind:ab-permission", getPermissionPath(column));
        element.attr("desc", column.getTable().getComment() + "-" + column.getComment());

        return element.toString();
    }


    public String getSubAttrs(IBusTableRel rel) {
        if (rel.getType().equals(BusTableRelType.MAIN.getKey())) return "";
        StringBuilder sb = new StringBuilder();
        sb.append(" table-key=\"" + rel.getTableKey() + "\" ");

        if (rel.getType().equals(BusTableRelType.ONE_TO_MANY.getKey()) && !rel.getParent().getType().equals(BusTableRelType.MAIN.getKey())) {
            sb.append(" v-model=\"subTempData." + rel.getBusObj().getKey() + "_" + rel.getTableKey() + "_Model\" ");
            sb.append(" @on-ok=\"subTempData." + rel.getBusObj().getKey() + "_" + rel.getTableKey() + "_okFn()\" ");
            sb.append(" @on-cancel=\"subTempData." + rel.getBusObj().getKey() + "_" + rel.getTableKey() + "_Model=false\" ");
        }
        return sb.toString();
    }

    public String getGroupTableName(FormGroup group) {
        if (CollectionUtil.isEmpty(group.getColumnList())) return "";
        String tableKey = null;

        for (FormColumn column : group.getColumnList()) {
            if (tableKey != null && !tableKey.equals(column.getTableKey())) {
                return "";
            }
            tableKey = column.getTableKey();
        }
        if (group.getTableRelation().getTableKey().equals(tableKey)) {
            return "";
        }

        return " table-key=\"" + tableKey + "\" ";
    }


    public Boolean isMultilayer(IBusTableRel rel) {
        if (rel.getType().equals(BusTableRelType.ONE_TO_MANY.getKey()) && !rel.getParent().getType().equals(BusTableRelType.MAIN.getKey())) {
            return Boolean.valueOf(true);
        }
        return Boolean.valueOf(false);
    }


    @Override
    protected void handlePermission(Element element, IBusinessColumn column) {
        element.attr("v-ab-permission", getPermissionPath(column));
    }


    protected void handleValidateRules(Element element, IBusinessColumn column) {
        super.handleValidateRules(element, column);
        element.attr("v-ab-validate", element.attr("ab-validate"));
        element.attr("desc", column.getTable().getComment() + "-" + column.getComment());
        element.removeAttr("ab-validate");
    }


    public String getScopePath(IBusTableRel relation) {
        return ((VueFormElementGenerator) AppUtil.getBean(VueFormElementGenerator.class)).getScopePath(relation);
    }


    public String getScopePath_old(IBusTableRel relation) {
        return super.getScopePath(relation);
    }


    protected String getPermissionPath(IBusinessColumn column) {
        return ((VueFormElementGenerator) AppUtil.getBean(VueFormElementGenerator.class)).getPermissionPath(column);
    }


    public String getLineColumn(IBusinessColumn column, IBusTableRel relation) {
        ThreadMapUtil.put("isLine", Boolean.valueOf(true));
        String str = getColumn(column, relation);
        ThreadMapUtil.remove("isLine");
        return str;
    }

    public String getLineColumn(FormGroup group, FormColumn formColumn) {
        IBusTableRel tableRel = group.getTableRelation();


        if (StringUtil.isNotEmpty(formColumn.getTableKey()) && !formColumn.getTableKey().equals(tableRel.getTableKey())) {
            IBusTableRel table = tableRel.find(formColumn.getTableKey());
            if (table != null) {
                tableRel = table;
            }
        }

        if (!formColumn.getTableKey().equals(tableRel.getTableKey())) {
            this.LOG.error("生成表单可能存在异常！formColumnTableKey{},tableRelTableKey{}", formColumn.getTableKey(), tableRel.getTableKey());
        }

        IBusinessColumn businessColumn = tableRel.getTable().getColumnByKey(formColumn.getKey());

        if (businessColumn == null) {
            this.LOG.error("布局模板查找Column配置失败！字段：{}，表：{}", formColumn.getComment(), formColumn.getTableKey());
        }

        return getLineColumn(businessColumn, tableRel);
    }
}
